import java.io.*;
import java.net.*;

/**
* Clase para manejar cada una de las conexiones de los clientes 
*/
public class hilo extends Thread {

  private SocketBytes SocketDatos; // Socket de comunicaci�n
  private servidor_dinamico sd; // Objeto Servidor
  private int id; // identificador de cliente conectado
  /*
  * Constructor que recibe Socket de comunicaci�n y objeto servidor para actualizar n�mero de conexiones
  */
  hilo(SocketBytes SocketDatos_in, servidor_dinamico sd_in) {
   try {
      // miembros para comunicacion por sockets
      SocketDatos = SocketDatos_in;
      sd =sd_in;

      // SocketDatos.setSOTimeout(3000); // Colocar un tope a la espera en una operaci�n de lectura de un socket
      id = ((Integer) SocketDatos.recibeMensaje()).intValue();
    } catch (Exception e) // Imprimir cualquier excepci�n
    { System.err.println(e); }
  } // hilo

  public void run() {
    boolean acabar = false;
    int dato;

    try {
      while (acabar == false) {
        try {  
          dato = ((Integer) SocketDatos.recibeMensaje()).intValue();
        } catch (Exception e) { 
          System.err.println(e);
          break;
        }

        if (dato == 0)
          acabar = true;
        else
          System.out.println("Thread de p_cliente " + id +  " ha recibido dato = " +  dato);
      } // while ...

      System.out.println("Thread de p_cliente " + id + " ha salido");      
      // Cerrar la conexi�n abierta e indicar que hay una conexi�n libre en el servidor concurrente
      SocketDatos.close();
      sd.subnumcon();
      synchronized (sd) {
        sd.notify();
      }
    } catch (Exception e) // Imprimir cualquier excepci�n
    { System.err.println(e); }
  } // run
} // hilo
